package com.shishuo.base;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.github.pagehelper.PageHelper;

import tk.mybatis.mapper.entity.Example;

/**
 * <p>
 * Description: 基础Service类
 * <p>
 * @author XQF SUI
 * <p>
 * Create Date: 2016年3月23日 下午10:39:59
 * <p>
 * @version 1.0
 */
public abstract class BaseService<T extends BaseEntity> {
	
	@Autowired
    protected BaseMapper<T> baseMapper;
	
	/**
     * 当前的泛型class
     */
    private Class<T> tClazz;
    
    /**
     * 构造方法
     */
    @SuppressWarnings("unchecked")
    public BaseService() {
        Type genType = getClass().getGenericSuperclass();
        Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
        tClazz = (Class<T>) params[0];
    }
    
    /**
     * <p>
     * Description:根据字段值获取数据(单条)
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:40:18
     * @param propertyName
     * @param value
     * @return
     * @throws Exception 
     */
    public T getByFieldEqual(String propertyName, Object value) throws Exception {
        List<T> list = getListByFieldEqual(propertyName, value);
        
        if(list != null && !list.isEmpty()){
            if(list.size() > 1){
                throw new Exception("返回多于一条的记录 class " + tClazz  + "  propertyname [" + propertyName +"  value  " + value );
            }else{
                return list.get(0);
            }
        }
        
        return null;
      }

    /**
     * <p>
     * Description:根据字段值获取数据(多条)
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:40:48
     * @param propertyName 字段名
     * @param value 值
     * @return
     */
    public List<T> getListByFieldEqual(String propertyName, Object value) {
        Example e = new Example(tClazz);
        e.createCriteria().andEqualTo(propertyName, value);
        return this.baseMapper.selectByExample(e);
    }
    
    /**
     * <p>
     * Description:根据ID获取对象
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:41:20
     * @param id
     * @return
     */
    public T getById(String id) {
        return this.baseMapper.selectByPrimaryKey(id);
    }
    
    /**
     * <p>
     * Description:报错对象信息
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:41:36
     * @param t
     */
	public String insert(T t) {
		t.initialCreateProperty();
        this.baseMapper.insert(t);
        return t.getId();
    }
    
    /**
     * <p>
     * Description:根据ID更新对象
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:41:55
     * @param t
     */
	public int updateById(T t) {
		t.initialOperateProperty();
        return this.baseMapper.updateByPrimaryKey(t);
    }
    
    /**
     * <p>
     * Description:根据ID更新对象不为空的属性
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:42:11
     * @param t
     * @return 
     */
	public int updateByIdSelective(T t){
		t.initialOperateProperty();
        return this.baseMapper.updateByPrimaryKeySelective(t);
    }
    
    /**
     * <p>
     * Description:根据ID删除数据
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:42:53
     * @param id
     */
    public void deleteById(Long id) {
        this.baseMapper.deleteByPrimaryKey(id);
        
    }
    
    public void deleteByExample(Example example) {
    	this.baseMapper.deleteByExample(example);
    }
    
    /**
     * <p>
     * Description:根据条件查询数据
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:43:06
     * @param e
     * @return
     */
    public List<T> selectListByExample(Example e){
        return this.baseMapper.selectByExample(e);
    }
    
    /**
     * <p>
     * Description:根据属性查询对象
     * <p>
     * Author XQF SUI
     * <p>
     * Create Date: 2016年3月23日 下午10:43:23
     * @param e
     * @return
     * @throws Exception 
     */
    public T selectByExample(Example e) throws Exception {
        List<T> list = this.selectListByExample(e);
        
        if (list != null && !list.isEmpty()) {
            if (list.size() > 1) {
                throw new Exception("返回多于一条的记录selectByExample");
            } else {
                return list.get(0);
            }
        }
        
        return null;
    }
    
    /**
	 * <p>
	 * Description：分页查询
	 * </p>
	 * @author XQF SUI
	 * @created 2016年5月13日 上午9:25:11
	 * @param page 		分页信息
	 * @param example 	查询参数
	 * @return 			分页数据
	 */
    public Page<T> selectPageByExample(Page<T> page, Example example){
        com.github.pagehelper.Page<T> articlePage = PageHelper.startPage(page.getCurrent(), page.getRows());
        
        page.setDatas(this.selectListByExample(example));
        page.setTotal(articlePage.getPages());
        page.setRecords((int) articlePage.getTotal());
        
		return page;
    }
}